// 一，普通方式
// 1. es5 写法
function add1(args: string, arg2: number): number {
  return 123;
}

// 2, es6
const add2 = (args1: number, args2: number) => args1 + args2;

// 二， 回掉函数 定义 方式
// 需求 回掉函数 的 定义方式
// 3.完整的回掉函数定义
let add: (x: number, y: number) => number; // 这一行 就是 调用回掉函数的格式要求

add = (arg1: number, arg2: number) => arg1 + arg2; // 这一行就是 回掉函数的具体实现
// attentions： 函数的 行参 和 返回值 必须 与 定义的 回掉函数格式 对应

// 三， 接口定义
interface myFunc {
  (x: string, y: string): string;
}
// 四， 类型别名定义
type add = (x: number, y: number) => number;
// 4.1 attentions: myString 就可以替代string了
type myString = string;

// 五， 可选参数,
// js 的 可选参数是可以在 任意 位置， 但是在调用的时候 需要 传入 undefeated 占位
// ts 中 可选参数 必须在 必选参数后面
type AddFunction = (arg1: number, arg2: number, arg3?: number) => number;

let addFunction1: AddFunction;
addFunction1 = (x: number, y: number) => x + y;
// addFunction1 = (x: number, y: number, z: number) => x + y + z;

// 六， 默认参数, 可以不需要传类型
let addFunction2 = (x: number, y = 2) => x + y;

// 七， 参数列表
const handleFunc = (arg1: number, ...args: number[]) => {
  // ...
};

// 八， 重载不是 java的重载
// 重载：只能使用function 来定义 不能使用其他方式
// 定义方式如下
function handleData(x: string): string[];
function handleData(x: number): number[];
function handleData(x: any): any {
  if (typeof x === 'string') {
    return x.split('');
  } else {
    return x
      .tostring()
      .split('')
      .map((ele: String) => Number(ele));
  }
}
console.log(handleData('123'));
console.log(handleData(123));
